#include <stdio.h>
#include <signal.h>
#include <unistd.h>
#include <stdlib.h>

void sigcb(int signum)
{
    printf("signal %d\n", signum);
}

int main()
{
    // 定义信号集
    sigset_t newmask, oldmask;

    // 初始化信号集为空
    sigemptyset(&newmask);
    // 添加SIGINT(2号)信号 与 SIGRTMIN+6(40号)到信号集
    sigaddset(&newmask, SIGINT);
    sigaddset(&newmask, SIGRTMIN+6);

    // 阻塞指定信号
    if(sigprocmask(SIG_BLOCK, &newmask, &oldmask) < 0) {
        perror("sigprocmask");
        exit(EXIT_FAILURE);
    }

    printf("阻塞信号成功： 2号与40号\n");

    // 注册信号处理函数
    struct sigaction sa;
    sa.sa_flags = 0;
    sa.sa_handler = sigcb;
    sigemptyset(&sa.sa_mask);
    if(sigaction(SIGINT, &sa, NULL) < 0) {
        perror("sigaction");
        exit(EXIT_FAILURE);
    }
    if(sigaction(SIGRTMIN+6, &sa, NULL) < 0) {
        perror("sigaction");
        exit(EXIT_FAILURE);
    }

    // 给进程发送5次2号信号与5次40号信号
    for(int i = 0; i < 5; ++i) {
        kill(getpid(), SIGINT);
        kill(getpid(), SIGRTMIN+6);
        sleep(1);
    }

    printf("发送了5次2号信号、40号信号\n");
    sleep(3); // 等待信号处理
    
    // 解除信号阻塞
    if(sigprocmask(SIG_SETMASK, &oldmask, NULL) < 0) {
        perror("sigprocmask");
        exit(EXIT_FAILURE);
    }

    printf("解除了信号阻塞\n");

    sleep(3); 

    return 0;
}